﻿#ifndef ZFRAMELESSWIDGET_H
#define ZFRAMELESSWIDGET_H

#include "ZFramelessWidgetExports.h"
#include "ZShadowEffect.h"
#include "ZRoundEffect.h"
#include "ZBorderEffect.h"
#include <QWidget>
#include <QSharedPointer>

class QVBoxLayout;
class ZRoundWidget;
class FramelessHelper;

// 默认无边框、可拖动、可改变大小。
// 可以启用阴影，圆角。
class ZFRAMELESSWIDGET_DLL_API ZFramelessWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ZFramelessWidget(QWidget *parent = NULL);
    ~ZFramelessWidget();

    /**
     * @brief centralWidget
     * @return
     *  中心窗口控件指针
     * @note
     *  如果已有由ui文件（Qt设计师）生成的界面，想要转换为无边框窗口，
     *  只需要在setupUi的参数设置为centralWidget()即可。
     */
    QWidget *centralWidget();

    /**
     * @brief applyShadowEffect
     *  应用阴影样式。
     * @param
     *  参数为堆对象指针，交由此类管理。传入空指针取消阴影效果。
     */
    void applyShadowEffect(ZShadowEffect *);

    /**
     * @brief applyRoundEffect
     *  应用圆角样式
     * @param
     *  参数为堆对象指针，交由此类管理。传入空指针取消圆角效果。
     */
    void applyRoundEffect(ZRoundEffect *);

    /**
     * @brief applyBorderEffect
     *  应用边框样式
     * @param
     *  参数为堆对象指针，交由此类管理。
     */
    void applyBorderEffect(ZBorderEffect *);

private:
    void init();

private:
    QVBoxLayout     *m_root_v_lay;
    QVBoxLayout     *m_vlay_round_widget;
    ZRoundWidget    *m_round_widget;
    QWidget         *m_central_widget;                           // 背景窗口

    QScopedPointer<ZShadowEffect> m_shadow_effect;               // 阴影特效
    QScopedPointer<ZRoundEffect>  m_round_effect;                // 圆角特效
    QScopedPointer<ZBorderEffect> m_border_effect;               // 边框特效

    FramelessHelper *m_frameless_helper;                         // 实现拖动以及改变大小
};

#endif // ZFRAMELESSWIDGET_H
